#include "process_pool.h"

// 根据文件描述符发送文件
int train_file(int new_fd)
{
    // 发送文件名
    train_t t;
    t.data_len = strlen(FILENAME);
    strcpy(t.buf, FILENAME);
    int ret = send_n(new_fd, &t, 4 + t.data_len);
    SELFFUNC_ERR_CHECK(ret, "send_n");

    // 发送文件大小
    struct stat file_info;
    stat(FILENAME, &file_info);
    t.data_len = sizeof(file_info.st_size);
    memcpy(t.buf, &file_info.st_size, sizeof(file_info.st_size));
    ret = send_n(new_fd, &t, 4 + t.data_len);
    SELFFUNC_ERR_CHECK(ret, "send_n");

    // 发送文件内容，使用sendfile代替read提高发送速率
    int fd = open(FILENAME, O_RDONLY);

    ret = sendfile(new_fd, fd, NULL, file_info.st_size);
    ERROR_CHECK(ret, -1, "sendfile");
}

// 新功能1：大文件下载
// 出现原因：服务端发送速度和客户端接收速度不匹配
// 循环接收
int recv_n(int sfd, void* buf, int data_len)
{
    char *p = (char *)buf;
    int total = 0, ret;

    while (total < data_len)
    {
        ret = recv(sfd, p + total, data_len - total, 0);
        if (ret == 0) // 服务器断开
        {
            return -1;
        }
        total += ret;
    }
    return 0;
}

// 循环发送，可以不写，因为send一定发送指定大小
int send_n(int sfd, void* buf, int data_len)
{
    char *p = (char *)buf;
    int total = 0, ret;

    while (total < data_len)
    {
        // data_len：总共要发送的文件大小
        // total：已发送的文件大小
        ret = send(sfd, p + total, data_len - total, 0);
        // send对端断开返回-1
        if (ret == -1) // 客户端断开
        {
            return -1;
        }
        total += ret;
    }
    return 0;
}